package com.lzb.browser;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Handler;
import android.util.Log;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.FragmentUtils;
import com.lzb.browser.activity.DownloadCacheActivity;
import com.lzb.browser.activity.DownloadPictureActivity;
import com.lzb.browser.activity.HistoryActivity;
import com.lzb.browser.activity.SearchActivity;
import com.lzb.browser.activity.SettingActivity;
import com.lzb.browser.databinding.ActivityHomeBinding;
import com.lzb.browser.dialog.AddCollectDialog;
import com.lzb.browser.dialog.ClearDialog;
import com.lzb.browser.dialog.MoreDialog;
import com.lzb.browser.fragment.HomeFragment;
import com.lzb.browser.fragment.BrowserFragment;
import com.blankj.utilcode.util.ToastUtils;
import com.lzb.browser.utils.AppSpUtils;
import com.lzb.browser.utils.IconDownloadTask;
import com.lzb.browser.utils.IconUtils;
import com.lzb.browser.bean.CollectBean;
import com.lzb.browser.basic.utils.SPUtil;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

public class HomeActivity extends BaseAc<ActivityHomeBinding> implements View.OnClickListener {

    private List<Fragment> mFragmentList;
    private HomeFragment homeFragment;
    private BrowserFragment browserFragment;
    private String lastBrowserUrl; // 保存最后访问的URL

    @Override
    protected int onCreate() {
        return R.layout.activity_home;
    }

    @Override
    protected void initView() {
        mDataBinding.llSearch.setOnClickListener(this);

        mDataBinding.ivLast.setOnClickListener(this);
        mDataBinding.ivNext.setOnClickListener(this);
        mDataBinding.ivHome.setOnClickListener(this);
        mDataBinding.ivMore.setOnClickListener(this);
        mDataBinding.ivExitFullScreen.setOnClickListener(this);

        // 初始化底部按钮状态
        updateNavigationButtonsState();

        // 初始化Fragment列表
        mFragmentList = new ArrayList<>();
        homeFragment = new HomeFragment();
        mFragmentList.add(homeFragment);

        // 添加Fragment到容器中
        FragmentUtils.add(getSupportFragmentManager(), mFragmentList, R.id.flContainer, 0);

        // 初始化夜间模式状态
        initNightMode();
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        if (id == R.id.llSearch) {//搜索
            Intent intent = new Intent(this, SearchActivity.class);
            startActivityForResult(intent, Content.SEARCH_FLAG);
        } else if (id == R.id.ivLast) {//上一页
            if (browserFragment != null && browserFragment.isVisible()) {
                if (browserFragment.canGoBack()) {
                    browserFragment.goBack();
                } else {
                    // 如果WebView无法后退，返回主页
                    navigateToHome();
                }
            } else {
                navigateToHome();
            }
        } else if (id == R.id.ivNext) {//下一页
            // 下一页功能
            if (browserFragment != null && browserFragment.isVisible()) {
                // 如果当前在browserFragment，执行前进操作
                if (browserFragment.canGoForward()) {
                    browserFragment.goForward();
                }
            } else {
                // 如果当前不在browserFragment（在HomeFragment），但有保存的URL，回到browserFragment
                if (lastBrowserUrl != null && !lastBrowserUrl.isEmpty()) {
                    // 重新加载之前保存的URL
                    loadUrl(lastBrowserUrl);
                }
            }
        } else if (id == R.id.ivHome) {//主页
            navigateToHome();
        } else if (id == R.id.ivMore) {//更多
            // 更多功能菜单
            showMoreDialog();
        } else if (id == R.id.ivExitFullScreen) {//退出全屏
            SPUtil.putBoolean(this, Content.isFullScreenMode, false);
            toggleFullScreenMode();
        }
    }

    /**
     * 显示更多功能菜单
     */
    private void showMoreDialog() {
        // 这里可以实现更多功能菜单
        // 例如：刷新、分享、收藏、设置等
        MoreDialog dialog = new MoreDialog(mContext);
        dialog.setListener(new MoreDialog.Ilistener() {
            @Override
            public void clickItem(int type) {
                switch (type) {
                    case 0://夜间模式
                        toggleNightMode();
                        break;
                    case 1://全屏模式
                        toggleFullScreenMode();
                        break;
                    case 2://无图模式
                        toggleImagelessMode();
                        break;
                    case 3://无痕模式
                        toggleTracelessMode();
                        break;
                    case 4://历史
                        Intent intent = new Intent(HomeActivity.this, HistoryActivity.class);
                        startActivityForResult(intent, Content.SEARCH_FLAG);
                        break;
                    case 5: // 添加收藏
                        if (browserFragment != null && browserFragment.isVisible()) {
                            addCurrentPageToCollect();
                        }
                        break;
                    case 6://设置
                        Intent intent2 = new Intent(HomeActivity.this, SettingActivity.class);
                        startActivityForResult(intent2, Content.SETTING_FLAG);
                        break;
                    case 7: // 刷新
                        if (browserFragment != null && browserFragment.isVisible()) {
                            browserFragment.reload();
                        }
                        break;
                    case 8://图片
                        startActivity(DownloadPictureActivity.class);
                        break;
                    case 9://缓存下载
                        startActivity(DownloadCacheActivity.class);
                        break;
                    case 10: // 页内查找
                        if (browserFragment != null && browserFragment.isVisible()) {
                            showInPageSearchDialog();
                        }
                        break;
                    case 11://退出
                        boolean isRemind = SPUtil.getBoolean(mContext, Content.isRemindClearRecord, false);
                        if (isRemind) {
                            showClearDialog();
                        } else {
                            AppUtils.exitApp();
                        }
                }
            }
        });
        dialog.show();
    }

    /**
     * 添加当前页面到收藏
     */
    private void addCurrentPageToCollect() {
        if (browserFragment != null && browserFragment.isVisible()) {
            AddCollectDialog dialog = new AddCollectDialog(mContext);
            dialog.setAdd(true);
            dialog.setSaveTitle(browserFragment.getTitle());
            dialog.setSaveUrl(browserFragment.getUrl());
            dialog.setListener(new AddCollectDialog.Ilistener() {
                @Override
                public void clickConfirm(String title, String url) {
                    if (title != null && url != null) {
                        // 获取网站图标URL
                        String iconUrl = IconUtils.getDefaultFaviconUrl(url);

                        // 创建收藏对象
                        CollectBean collectBean = new CollectBean(title, url, iconUrl);

                        // 获取现有的收藏列表
                        List<CollectBean> collectList = AppSpUtils.getCollectList();
                        if (collectList == null) {
                            collectList = new ArrayList<>();
                        }

                        // 检查是否已经存在相同的URL
                        boolean exists = false;
                        for (CollectBean item : collectList) {
                            if (item.getUrl().equals(url)) {
                                exists = true;
                                break;
                            }
                        }

                        if (!exists) {
                            // 添加到列表
                            collectList.add(collectBean);

                            // 保存到SharedPreferences
                            AppSpUtils.saveCollectList(collectList);

                            // 下载图标
                            downloadIconForCollect(collectBean);

                            ToastUtils.showShort("已添加到收藏");
                        } else {
                            ToastUtils.showShort("该网址已在收藏中");
                        }
                    } else {
                        ToastUtils.showShort("无法获取页面信息");
                    }
                }
            });
            dialog.show();
        } else {
            ToastUtils.showShort("请先打开一个网页");
        }
    }

    /**
     * 下载收藏项的图标
     */
    private void downloadIconForCollect(CollectBean collectBean) {
        if (collectBean.getIconUrl() != null && !collectBean.getIconUrl().isEmpty()) {
            new IconDownloadTask(this, new IconDownloadTask.OnIconDownloadListener() {
                @Override
                public void onIconDownloaded(Bitmap bitmap, String iconUrl) {
                    // 将图标转换为Base64
                    String iconData = IconUtils.bitmapToBase64(bitmap);
                    if (iconData != null) {
                        collectBean.setIconData(iconData);

                        // 更新收藏列表
                        List<CollectBean> collectList = AppSpUtils.getCollectList();
                        if (collectList != null) {
                            for (int i = 0; i < collectList.size(); i++) {
                                if (collectList.get(i).getUrl().equals(collectBean.getUrl())) {
                                    collectList.set(i, collectBean);
                                    break;
                                }
                            }
                            AppSpUtils.saveCollectList(collectList);
                        }
                    }
                }

                @Override
                public void onIconDownloadFailed(String iconUrl) {
                    // 图标下载失败，使用默认图标
                    // 这里可以记录日志或显示默认图标
                    Log.e("TAG", "onIconDownloadFailed: " + iconUrl);
                }
            }).execute(collectBean.getIconUrl());
        }
    }

    @Override
    protected void initData() {

    }

    @Override
    public void onBackPressed() {
        // 先让WebViewFragment处理返回键
        if (!handleBackPressed()) {
            // 如果WebViewFragment没有处理，则调用父类的返回键处理
//            updateNavigationButtonsState();
            boolean isRemind = SPUtil.getBoolean(mContext, Content.isRemindClearRecord, false);
            if (isRemind) {
                showClearDialog();
            } else {
                super.onBackPressed();
            }
        }
    }

    /**
     * 处理返回键事件
     *
     * @return true表示已处理，false表示未处理
     */
    private boolean handleBackPressed() {
        if (browserFragment != null && browserFragment.isVisible()) {
            if (browserFragment.canGoBack()) {
                browserFragment.goBack();
                // 更新导航按钮状态
                updateNavigationButtonsState();
                return true;
            } else {
                // WebView无法后退时，返回主页
                navigateToHome();
                return true;
            }
        }
        return false;
    }

    /**
     * 显示页内查找对话框
     */
    private void showInPageSearchDialog() {
        if (browserFragment != null && browserFragment.isVisible()) {
            browserFragment.showFindDialog();
        }
    }

    /**
     * 加载URL到WebViewFragment
     *
     * @param url 要加载的URL
     */
    public void loadUrl(String url) {
        // 保存最后访问的URL
        lastBrowserUrl = url;

        // 创建WebViewFragment实例并传递URL
        browserFragment = BrowserFragment.newInstance(url);

        // 替换当前Fragment为WebViewFragment
        FragmentUtils.replace(
                getSupportFragmentManager(),
                browserFragment,
                R.id.flContainer,
                true // 添加到返回栈，支持返回键
        );
        // 更新导航按钮状态
        updateNavigationButtonsState();

        // 应用夜间模式（如果已开启）
        boolean isNightMode = SPUtil.getBoolean(this, Content.isNightMode, false);
        if (isNightMode) {
            // 延迟执行以确保页面加载完成
            browserFragment.getView().postDelayed(new Runnable() {
                @Override
                public void run() {
                    applyNightMode();
                }
            }, 1000);
        }

        // 应用全屏模式（如果已开启）
        boolean isFullScreenMode = SPUtil.getBoolean(this, Content.isFullScreenMode, false);
        if (isFullScreenMode) {
            mDataBinding.ivExitFullScreen.setVisibility(View.VISIBLE);
            mDataBinding.llSearch.setVisibility(View.GONE);
            mDataBinding.llBottom.setVisibility(View.GONE);
        } else {
            mDataBinding.ivExitFullScreen.setVisibility(View.GONE);
            mDataBinding.llSearch.setVisibility(View.VISIBLE);
            mDataBinding.llBottom.setVisibility(View.VISIBLE);
        }

        // 应用无图模式设置
        initImagelessMode();

        // 应用无痕模式设置
        initTracelessMode();
    }

    /**
     * 返回主页
     * 注意：返回主页时不清除lastBrowserUrl，保持状态以便下次通过下一页按钮返回
     */
    public void navigateToHome() {
        if (homeFragment != null) {
            FragmentUtils.replace(
                    getSupportFragmentManager(),
                    homeFragment,
                    R.id.flContainer,
                    false // 不添加到返回栈
            );
        }
        mDataBinding.ivExitFullScreen.setVisibility(View.GONE);
        mDataBinding.llSearch.setVisibility(View.VISIBLE);
        mDataBinding.llBottom.setVisibility(View.VISIBLE);
        // 更新导航按钮状态
        updateNavigationButtonsState();
    }

    /**
     * 获取最后访问的浏览器URL
     *
     * @return 最后访问的URL，如果没有则返回null
     */
    public String getLastBrowserUrl() {
        return lastBrowserUrl;
    }

    /**
     * 清除浏览器状态
     */
    public void clearBrowserState() {
        lastBrowserUrl = null;
        browserFragment = null;
    }

    /**
     * 初始化夜间模式
     */
    private void initNightMode() {
        boolean isNightMode = SPUtil.getBoolean(this, Content.isNightMode, false);
        if (isNightMode && browserFragment != null && browserFragment.isVisible()) {
            // 延迟执行以确保页面加载完成
            browserFragment.getView().postDelayed(new Runnable() {
                @Override
                public void run() {
                    applyNightMode();
                }
            }, 1000);
        }
    }

    /**
     * 初始化无图模式
     */
    private void initImagelessMode() {
        if (browserFragment != null && browserFragment.isVisible()) {
            // 立即应用无图模式设置
            browserFragment.updateImagelessMode();
        }
    }

    /**
     * 初始化无痕模式
     */
    private void initTracelessMode() {
        if (browserFragment != null && browserFragment.isVisible()) {
            // 立即应用无痕模式设置
            browserFragment.updateTracelessMode();
        }
    }

    /**
     * 切换夜间模式
     */
    public void toggleNightMode() {
        boolean isNightMode = SPUtil.getBoolean(this, Content.isNightMode, false);

        if (isNightMode) {
            applyNightMode();
            ToastUtils.showShort("夜间模式已开启");
        } else {
            removeNightMode();
            ToastUtils.showShort("夜间模式已关闭");
        }
    }

    /**
     * 切换全屏模式
     */
    public void toggleFullScreenMode() {
        boolean isFullScreenMode = SPUtil.getBoolean(this, Content.isFullScreenMode, false);

        if (browserFragment != null && browserFragment.isVisible()) {
            if (isFullScreenMode) {
                mDataBinding.ivExitFullScreen.setVisibility(View.VISIBLE);
                mDataBinding.llSearch.setVisibility(View.GONE);
                mDataBinding.llBottom.setVisibility(View.GONE);
            } else {
                mDataBinding.ivExitFullScreen.setVisibility(View.GONE);
                mDataBinding.llSearch.setVisibility(View.VISIBLE);
                mDataBinding.llBottom.setVisibility(View.VISIBLE);
            }
        }
    }

    /**
     * 切换无图模式
     */
    public void toggleImagelessMode() {
        boolean isImagelessMode = SPUtil.getBoolean(this, Content.isImagelessMode, false);

        if (isImagelessMode) {
            ToastUtils.showShort("无图模式已开启");
        } else {
            ToastUtils.showShort("无图模式已关闭");
        }

        // 如果当前在浏览器页面，重新加载以应用无图模式设置
        if (browserFragment != null && browserFragment.isVisible()) {
            browserFragment.reload();
        }
    }

    /**
     * 切换无痕模式
     */
    public void toggleTracelessMode() {
        boolean isTracelessMode = SPUtil.getBoolean(this, Content.isTracelessMode, false);

        if (isTracelessMode) {
            ToastUtils.showShort("无痕模式已开启");
        } else {
            ToastUtils.showShort("无痕模式已关闭");
        }

        // 如果当前在浏览器页面，重新加载以应用无痕模式设置
        if (browserFragment != null && browserFragment.isVisible()) {
            browserFragment.reload();
        }
    }

    /**
     * 应用夜间模式
     */
    private void applyNightMode() {
        if (browserFragment != null && browserFragment.isVisible()) {
            browserFragment.setWebViewBackgroundColor(Color.BLACK); // 黑色背景
            // 延迟执行以确保页面加载完成
            browserFragment.getView().postDelayed(new Runnable() {
                @Override
                public void run() {
                    browserFragment.setWebViewBackgroundColor(Color.BLACK);
                }
            }, 500);
        }
    }

    /**
     * 移除夜间模式
     */
    private void removeNightMode() {
        if (browserFragment != null && browserFragment.isVisible()) {
            // 移除夜间模式时不设置特定颜色，让WebView使用默认背景
            browserFragment.setWebViewBackgroundColor(android.R.color.transparent);
        }
    }

    /**
     * 更新导航按钮状态
     * 根据当前Fragment和浏览器状态设置按钮的可点击状态和图标
     */
    public void updateNavigationButtonsState() {
        if (browserFragment != null && browserFragment.isVisible()) {
            // 当前在BrowserFragment
            boolean canGoBack = browserFragment.canGoBack();
            boolean canGoForward = browserFragment.canGoForward();

            // 设置上一页按钮状态：可以返回历史记录或返回主页
            mDataBinding.ivLast.setEnabled(true); // 始终可用，可以返回历史或主页
            mDataBinding.ivLast.setImageResource(R.drawable.shangyiye2);

            // 设置下一页按钮状态
            mDataBinding.ivNext.setEnabled(canGoForward || lastBrowserUrl != null);
            mDataBinding.ivNext.setImageResource(canGoForward ? R.drawable.xiayiye2 : R.drawable.xiayiye);

        } else {
            // 当前在HomeFragment
            mDataBinding.ivLast.setEnabled(false);
            mDataBinding.ivLast.setImageResource(R.drawable.shangyiye);

            // 下一页按钮：如果有保存的浏览器URL则可以点击
            boolean hasBrowserHistory = lastBrowserUrl != null && !lastBrowserUrl.isEmpty();
            mDataBinding.ivNext.setEnabled(hasBrowserHistory);
            mDataBinding.ivNext.setImageResource(hasBrowserHistory ? R.drawable.xiayiye2 : R.drawable.xiayiye);
        }

        // 主页按钮始终可用
        mDataBinding.ivHome.setEnabled(true);

        // 更多按钮：只有在BrowserFragment中才可用
//        mDataBinding.ivMore.setEnabled(browserFragment != null && browserFragment.isVisible());
    }

    private void showClearDialog() {
        ClearDialog dialog = new ClearDialog(mContext);
        dialog.setListener(new ClearDialog.Ilistener() {
            @Override
            public void clickConfirm() {
                AppSpUtils.saveRecordList(new ArrayList<>());
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        AppUtils.exitApp();
                    }
                },100);
            }
        });
        dialog.show();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Content.SEARCH_URL_RESULT) {
            String url = data.getStringExtra(Content.url);
            // 跳转到WebViewFragment并传递URL
            loadUrl(url);
        } else if (resultCode == Content.SEARCH_TITLE_RESULT) {
            String title = data.getStringExtra(Content.url);
            try {
                String url = AppConfig.BAIDU_URL + URLEncoder.encode(title, "UTF-8");
                // 跳转到WebViewFragment并传递URL
                loadUrl(url);
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        } else if (resultCode == RESULT_OK) {
            if (browserFragment != null && browserFragment.isVisible()) {
                browserFragment.changeUaCode();
            }
        }
    }


}